#include <stdio.h>
#include <stdlib.h>       // atexit(), exit()
#include <unistd.h>       // pause()
#include <signal.h>       // signal()
#include <sys/time.h>     // setitimer() and structs

//静态全局变量
//改变普通全局变量的“外部链接属性”为“内部链接”
//使之只属于这个.c文件
static int alarm_count = 0;

//信号处理函数
//每次定时器触发，系统会调用这个函数
void timer_handler(int signum){
	printf("hello\n");

	alarm_count++;

	//检查是否已经触发200次（200*50ms = 10s）
	if(alarm_count >= 200){
		printf("timer 10s, timeout\n");
		exit(0);//正常退出程序
	}
}

int main(){
	//1.创建itimerval结构体变量
	struct itimerval new_timer;

	//2.注册信号处理函数
	//告诉系统：当SIGALRM信号发生时，请调用 timer_handler 函数
	signal(SIGALRM,timer_handler);

	//3.配置timer的首次出发时间为1s
	new_timer.it_value.tv_sec = 1;
	new_timer.it_value.tv_usec = 0;

	//4.配置首次出发后，后续触发的时间间隔为50ms->50000us
	new_timer.it_interval.tv_sec = 0;
	new_timer.it_interval.tv_usec = 50000;

	//5.启动定时器
	// ITIMER_REAL: 使用真实时间计时
    // &new_timer: 传入我们的配置
    // NULL: 表示我们不关心旧的定时器设置
	if(setitimer(ITIMER_REAL, &new_timer,NULL) == -1){
		perror("setitimer");
		return -1;
	}

	printf("定时器已启动。1秒后将开始每50毫秒打印 'hello'...\n");

	// 6. 让主程序进入休眠，等待信号唤醒
    // 如果没有这个循环，main函数会直接执行完毕并退出，定时器就没机会触发了
	while(1){
		pause(); // pause()会使程序暂停，直到捕获一个信号为止
	}
	

	return 0;
}
